package com.lzw.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal工具类，用于安全管理线程局部变量
 * 提供线程变量的设置、获取、移除等操作，避免内存泄漏
 */
public class ThreadLocalUtil {
    // 使用静态ThreadLocal存储线程变量，值为一个Map，支持存储多个键值对
    private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL = ThreadLocal.withInitial(HashMap::new);

    /**
     * 私有构造方法，防止实例化
     */
    private ThreadLocalUtil() {
        throw new UnsupportedOperationException("工具类不允许实例化");
    }

    /**
     * 存储键值对到当前线程
     * @param key 键
     * @param value 值
     */
    public static void set(String key, Object value) {
        THREAD_LOCAL.get().put(key, value);
    }

    /**
     * 从当前线程获取值
     * @param key 键
     * @param <T> 值类型
     * @return 对应的值，如果不存在则返回null
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(String key) {
        Map<String, Object> map = THREAD_LOCAL.get();
        return (T) map.get(key);
    }

    /**
     * 从当前线程获取值，如果不存在则返回默认值
     * @param key 键
     * @param defaultValue 默认值
     * @param <T> 值类型
     * @return 对应的值或默认值
     */
    @SuppressWarnings("unchecked")
    public static <T> T get(String key, T defaultValue) {
        Map<String, Object> map = THREAD_LOCAL.get();
        return (T) map.getOrDefault(key, defaultValue);
    }

    /**
     * 移除当前线程中指定键的值
     * @param key 键
     */
    public static void remove(String key) {
        THREAD_LOCAL.get().remove(key);
    }

    /**
     * 清除当前线程中所有的变量，防止内存泄漏
     * 建议在请求结束或线程池中的线程执行完毕时调用
     */
    public static void clear() {
        THREAD_LOCAL.remove();
    }

    /**
     * 检查当前线程中是否包含指定键
     * @param key 键
     * @return 存在返回true，否则返回false
     */
    public static boolean containsKey(String key) {
        return THREAD_LOCAL.get().containsKey(key);
    }
}
